﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Happy.Primitive;
using Happy.Query;
using Happy.Query.Filters;

namespace Happy.Application.Query
{
    /// <summary>
    /// 泛型版本的查询服务。
    /// </summary>
    public abstract class QueryService<T, TId> : ServiceBase, IQueryService<T, TId>
    {
        /// <summary>
        /// 获取分页结果，面向支持分页的表格。
        /// </summary>
        public PageResult<T> Page(QueryRequest request)
        {
            var queryArgument = request.ToQueryArgument(this.FilterDefinition);

            return Page(queryArgument, request.Page, request.ItemsPerPage);
        }

        /// <summary>
        /// 获取分页结果，面向支持分页的表格。
        /// </summary>
        protected virtual PageResult<T> Page(QueryArgument queryArgument, long page, long itemsPerPage)
        {
            return this.QuerySource.Page(queryArgument, page, itemsPerPage);
        }

        /// <summary>
        /// 获取列表数据，面向不支持分页的表格或下拉框。
        /// </summary>
        public IEnumerable<T> Fetch(QueryRequest request)
        {
            var queryArgument = request.ToQueryArgument(this.FilterDefinition);

            return Fetch(queryArgument);
        }

        /// <summary>
        /// 获取列表数据，面向不支持分页的表格或下拉框。
        /// </summary>
        protected virtual IEnumerable<T> Fetch(QueryArgument queryArgument)
        {
            return this.QuerySource.Fetch(queryArgument);
        }

        /// <summary>
        /// 获取一行数据，面向表单。
        /// </summary>
        public T SingleOrDefault(QueryRequest request)
        {
            var queryArgument = request.ToQueryArgument(this.FilterDefinition);

            return this.QuerySource.SingleOrDefault(queryArgument);
        }

        /// <summary>
        /// 返回指定记录。
        /// </summary>
        public T SingleOrDefault(TId id, bool includeRelation = true)
        {
            return this.QuerySource.SingleOrDefault(id, includeRelation);
        }

        /// <summary>
        /// 数据源。
        /// </summary>
        protected IQuerySource<T> QuerySource
        {
            get
            {
                return this.Service<IQuerySource<T>>();
            }
        }

        /// <summary>
        /// 筛选器定义。
        /// </summary>
        protected abstract FilterDefinition FilterDefinition { get; }
    }

    /// <summary>
    /// 泛型版本的查询服务。
    /// </summary>
    public abstract class QueryService<T> : QueryService<T, Guid>
    {
    }
}
